\subsection{Implementación}

\title{Ping sobre ICMP}

Para implementar ping sobre ICMP se contruye un paquete ICMP dentro de un paquete IP, y se configura la dirección destino. La función sr1() de scapy envía este paquete y espera por la respuesta, simulando de esta manera un ping tradicional de consola.

\lstset{language=python,title={Ping sobre ICMP},caption={Ping sobre ICMP}}
\begin{footnotesize}
  \begin{lstlisting}[frame=bottomline]
  
def ping(ipAddress):
	ip = (IP(dst=ipAddress)/ICMP())
	response  = sr1(ip)

  \end{lstlisting}
\end{footnotesize}

\title{Traceroute sobre ICMP}

Traceroute es una herramienta que permite hacer un seguimiento de la ruta que toma un paquete hasta llegar al host destino.
Según lo desarrollado en el punto anterior, ICMP puede ser utilizado para implementar Traceroute. Para ello se construye un paquete IP/ICMP con ttl inicialmente igual a 1. El host que decrementa el ttl a 0 es quien responde a la solicitud del paquete ICMP. Esta respuesta nos da información básica del router (en este caso su dirección) que se almacena para el armado de la ruta final. El valor de ttl se va incrementando en un ciclo, almacenando asi las direcciones de los routers por donde va pasando el paquete. Tarde o temprano se llegara al host destino, o a una cota superior, lo que resulte primero.


\lstset{language=python,title={Traceroute sobre ICMP},caption={Traceroute sobre ICMP}}
\begin{footnotesize}
  \begin{lstlisting}[frame=bottomline]
  
def traceroute(destination):
    i = 1
    maxTTL = 50
    isReached = False
    responses = []
    ipPacket = (IP(dst=destination,ttl=1)/ICMP())
    while not isReached and i <= maxTTL:
        ipPacket.ttl = i
        res = sendPacket(ipPacket)
        if res[0] is None:
            resAsString = str(i) + " *"
        else:
        	if isDestReached(res[0]):
        		isReached = True
        		resAsString = cutePrint(i,res) + " ---> Destination Reached."
        	else:
        		resAsString = cutePrint(i,res)
        responses.append(resAsString)        
        i = i+1
        
    printResponses(responses)
  \end{lstlisting}
\end{footnotesize}

